package com.mz361.common.utils;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class PdfWatermarkUtil {

    /**
     * 给PDF文件添加文字水印
     *
     * @param pdfBytes      原始PDF文件的字节数组
     * @param watermarkText 水印文字内容
     * @param watermarkFont 水印文字字体（这里使用iText的Font对象定义，包括字体、字号、颜色等属性）
     * @param x             水印文字在x轴的起始位置（相对页面坐标）
     * @param y             水印文字在y轴的起始位置（相对页面坐标）
     * @param opacity       水印文字的透明度（取值范围0 - 1，0表示完全透明，1表示完全不透明）
     * @return 添加水印后的PDF文件字节数组
     */
    public static byte[] addTextWatermark(byte[] pdfBytes, String watermarkText, Font watermarkFont,
                                          int x, int y, float opacity) {
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            PdfReader reader = new PdfReader(pdfBytes);
            PdfStamper stamper = new PdfStamper(reader, outputStream);
            int numPages = reader.getNumberOfPages();

            // 设置水印文字的透明度
            PdfGState gState = new PdfGState();
            gState.setFillOpacity(opacity);

            for (int i = 1; i <= numPages; i++) {
                PdfContentByte contentByte = stamper.getOverContent(i);
                contentByte.saveState();
                contentByte.setGState(gState);
                contentByte.beginText();
                contentByte.setFontAndSize(watermarkFont.getBaseFont(), watermarkFont.getSize());
                contentByte.showTextAligned(Element.ALIGN_LEFT, watermarkText, x, y, 0);
                contentByte.endText();
                contentByte.restoreState();
            }

            stamper.close();
            reader.close();
            return outputStream.toByteArray();
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
            return null;
        }
    }
}
